// 引入Vue
import Vue from 'vue'
// 引入vue-route路由组件
import VueRouter from 'vue-router'
import routes from './routes'
// 使用插件
Vue.use(VueRouter)
// 引入stor
import store from '@/store'

// 先把VueRouter原型对象的push，先保存一份
let origionPush = VueRouter.prototype.push
let origionReplace = VueRouter.prototype.replace

// 重写 push | replace
// 第一个参数：告诉原来push方法，你往哪里跳转（传递哪些参数）
// 第二个参数：成功回调
// 第三个参数：失败的回调
VueRouter.prototype.push = function (location, reslove, reject) {
    if (reslove && reject) {
        // call || apply区别：
        // 相同点，都可以调用函数一次，都可以篡改函数的上下文一次
        // 不同点： call和appply传递参数，call传递参数用逗号隔开，apply方法执行，传递数组
        origionPush.call(this, location, reslove, reject)
    } else {
        origionPush.call(this, location, () => { }, () => { })
    }
}
VueRouter.prototype.replace = function (location, reslove, reject) {
    if (reslove && reject) {
        origionReplace.call(this, location, reslove, reject)
    } else {
        origionReplace.call(this, location, () => { }, () => { })
    }
}
//第二步:暴露VueRouter类的实例
//对外暴露一个路由器,实质是VueRouter类的实例,一个路由器可以管理多个路由
const router = new VueRouter({
    //配置路由
    routes,
    //设置滚动条的位置
    scrollBehavior() {
        //滚动行为这个函数,需要有返回值,返回值为一个对象。
        //经常可以设置滚动条x|y位置 [x|y数值的设置一般最小是零]
        return { y: 0 };
    }
});

export default router;


//全局守卫:只要项目中有任何路由变化，全局守卫都会进行拦截【符合条件走你，不符合条件不能访问】

//全局守卫:全局前置守卫【访问之前进行触发】

//全局前置守卫
router.beforeEach(async (to, from, next) => {
    //to:去的那个路由的信息
    //from:从那个路由而来的信息
    //next:放行函数!!!!!! 
    //第一种：next(),放行函数，放行到它想去的路由！！！
    //第二种:next(path),守卫指定放行到那个路由去?
    // 为了测试先全部放行
    // next()
    // 用户登录了，才会有token，未登录一定不会有token
    let token = store.state.user.token
    // 用户信息
    let name = store.state.user.userInfo.name
    // 用户已经登录了
    if (token) {
        // 用户已经登录了还想去login[不能去，停留在首页]
        if (to.path == '/login') {
            next('/home')
        } else {
            // 登录了，但是去的不是login【home、search、detail、shopcart】
            // 如果用户名已有
            if (name) {
                next()
            } else {
                // 没有用户信息,派发action让仓库存储用户信息在跳转
                try {
                    // 获取用户信息成功
                    await store.dispatch("getUserInfo")
                    next()
                } catch (error) {
                    // token失效了获取不到用户的信息
                    // 清除token
                    await store.dispatch('userLogout')
                    next('/login')
                }
            }
        }
    } else {
        // 未登录暂不能去交易相关、不能去支付相关的【pay | paysuccess】、不能去个人中心
        // 未登录去上面这些路由----登录页
        let toPath = to.path
        // toPath == '/trade' || toPath == '/pay' || toPath == '/paysuccess' || toPath == '/center' || toPath == '/center/myorder'
        if(toPath.indexOf('/tarde') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
            // 把未登录的时候想去而没有去成的信息，存储于地址栏中【路由】
            next('/login?redirect=' + toPath)
        }else {
            // 去的不是上面这些路由（home|search|shopCart）----放行
            next()
        }
        
    }
});


//全局后置守卫,几乎不用
// router.afterEach((to,from)=>{
//   console.log('后置守卫');
// })